CRUD Cassandra y Python

Sistemas de almacenamiento - Actividad 2

Autor: Camilo Martinez

Este README.md tiene como objectivo dar el detalle de la implementación realizada con un cluster de Cassandra 3.11, montado en docker, python 3.10 para la comunicación y automatización de procesos, y Dbeaver como entorno de trabajo de Cassandra.

El alcance de este trabajo se resume a continuación:

Modelo Conceptual


Modelo Conceptual

Modelo Relacional


Modelo Relacional

Modelo lógico

Consultas a satisfacer

Tabla 1: Pacientes Info

Consultas a satisfacer

  1. Obtener toda la información de un paciente por su nombre y DNI.
Nombre del Campo Tipo Primary Key Comentario
paciente_nombre text Partition Key Se utiliza paciente_nombre como clave de partición porque se usará para realizar búsquedas por nombre.
paciente_dni int Clustering Key El DNI se usa como clustering key para garantizar que cada paciente tenga un identificador único dentro de la partición.
paciente_fecha_nac date
paciente_direccion text
paciente_tlf text
paciente_alergias SET

Tabla 2: Citas por Medico

Consultas a satisfacer

  1. Obtener todas las citas atendidas por un médico.
Nombre del Campo Tipo Primary Key Comentario
medico_dni int Partition Key medico_dni se utiliza como clave de partición porque la consulta más común será obtener las citas de un médico específico.
cita_id int Clustering Key cita_id se usa como clave de agrupamiento para ordenar las citas de un mismo médico.
cita_fecha_hora timestamp
cita_motivo text

Tabla 3: Tratamientos por paciente

Consultas a satisfacer

  1. Obtener los tratamientos realizados a un paciente en base a su DNI y la cita.
Nombre del Campo Tipo Primary Key Comentario
paciente_dni int Partition Key paciente_dni es la clave de partición porque las consultas se realizan sobre el DNI del paciente.
cita_id int Clustering Key Se usa cita_id como clustering key para agrupar los tratamientos por cita.
tratamiento_id int Clustering Key Se añade tratamiento_id para ordenar los tratamientos dentro de una misma cita.
tratamiento_descripcion text
tratamiento_costo float

Tabla 4: Citas por paciente

Consultas a satisfacer

  1. Obtener el número de citas que ha tenido un paciente.
Nombre del Campo Tipo Primary Key Comentario
paciente_dni int Partition Key paciente_dni es la clave de partición porque se desea realizar consultas para un paciente específico.
cita_id counter Se utiliza un contador para registrar la cantidad de citas de un paciente.

Tabla 5: Recetas x Medicamentos

Consultas a satisfacer

  1. Obtener los medicamentos de una receta según la fecha de emisión.
Nombre del Campo Tipo Primary Key Comentario
receta_fecha_emision date Partition Key receta_fecha_emision se utiliza como clave de partición para facilitar las consultas por fecha de emisión de recetas.
receta_id int Clustering Key receta_id se utiliza como clustering key para ordenar los medicamentos dentro de cada receta.
medicamento_codigo int Clustering Key Se añade medicamento_codigo para mantener un orden dentro de cada receta.
medicamento_nombre text
medicamento_dosis text
  1. Obtener con el banco de una tarjeta todas las reservas que se hayan realizado.
Nombre del Campo Tipo Primary Key Comentario
tarjeta_banco text Partition Key El banco emisor de la tarjeta actúa como partition key para agrupar todas las reservas realizadas con tarjetas de un banco específico.
tarjeta_nro bigint Clustering Key El número de la tarjeta se utiliza como primera clustering key para ordenar las reservas dentro de un banco, garantizando la unicidad de las tarjetas. Se cambia a bigint dado que los números de tarjetas suelen ser largos.
reservacion_nro text Clustering Key El número de reservación se utiliza como segunda clustering key para garantizar unicidad.
reservacion_confirmado boolean Se añade para saber si la reserva esta confirmada o no.
  1. Considerando que el 60% de las películas tienen la categoría “Todos los públicos”, haga la tabla más óptima según rendimiento en la que se consulte por la categoría de la película.
Nombre del Campo Tipo Primary Key Comentario
pelicula_categoria text Partition Key La categoría de la película forma parte de la partition key compuesta, utilizada para agrupar películas por categoría y actor específico.
pelicula_actor text Partition Key El actor de la película forma parte de la partition key compuesta, permitiendo agrupar todas las películas en las que participa un actor específico dentro de una categoría. Esta se añade por el hecho que las categorias estan mayormente en un valor en particular, lo cual no es algo deseado para la llave de partición.
pelicula_nombre text Clustering Key El nombre de la película se utiliza como clustering key para ordenar las películas alfabéticamente dentro de cada categoría y actor, y asegurar unicidad.
pelicula_actores set Se adiciona un registro por cada actor.
  1. Obtener los nombres de usuario que tienen asociado un número de teléfono especifico.
Nombre del Campo Tipo Primary Key Comentario
usuario_tlf text Partition Key El teléfono del usuario actúa como partition key, ideal para buscar usuarios por un número de teléfono específico.
usuario_dni text Clustering Key El DNI del usuario se utiliza como clustering key, permitiendo ordenar los usuarios dentro de cada número de teléfono.
usuario_nombre text
usuario_tlfs set Se adiciona un registro por cada telefono
  1. Buscar cuántas funciones se han presentado en una ciudad buscando por su nombre.
Nombre del Campo Tipo Primary Key Comentario
ciudad_nombre text Partition Key El nombre de la ciudad actúa como partition key, utilizado para agrupar funciones por ciudad.
pelicula_nombre text Clustering Key El nombre de la película se utiliza como primera clustering key, permitiendo ordenar las funciones dentro de cada ciudad por película.
funcion_fecha_hora timestamp Clustering Key La fecha y hora de la función se utilizan como segunda clustering key, organizando cronológicamente las funciones para cada película dentro de una ciudad. Se añade como timestamp dado que las funciones contiene fecha y hora.

Además, cabe destacar que para poder generar las operaciones CRUD no solo se conto con las tablas descritas anteriormente para el modelo lógico, sino que además se añadieron tablas de relaciones, y soporte. También, se expone que para la visualización del tablero, y evidenciación de que las operaciones funcionan correctamente se realizan consultas ineficientes, esto para facilicitar la visualización del lector.

Tablas soporte usadas:

Tablas relaciones

A continuación se muestran las tablas resultantes desde DBeaver:

Modelo Logico 1 Modelo Logico 2


Funcionalidades

Las funcionalidades que se presentan están separadas por scripts de python para aislar los tipos de funcionalidades, y facilitar un poco la lectura del código. Entre las caracteristicas particulas a denotar están:

A continuación se muestran pantallazos de como lucen ambas interfaces. Mayormente me centrare en el tablero porque es más limpio visualmente de mostrar, sin embargo, queda a libre revisión la opción por terminal.

Tablero:

Ejecución de tablero de streamlit:

Ejecucion

Tablero página de inicio.

Note que hay dos botones para poder cargar datos de prueba, y limpiar todos los datos de las tablas. En todas las páginas se encuentran estos botones. Ejecucion

Tablero página de consultas.

Ejecucion

Tablero página de inserciones.

Ejecucion

Tablero página de inserciones. Inserción de Reservación.

Ejecucion

Tablero página de actualizaciones.

Ejecucion

Tablero página de actualizaciones. Actualizar categoria pelicula.

Ejecucion

Tablero página de eliminaciones.

Ejecucion

Tablero página de eliminaciones. Eliminación relación Tarjeta Reservación.

Ejecucion

Tablero página de consultas. Consulta Tabla 1

Ejecucion

Tablero página de consultas. Consulta Tabla 2

Ejecucion

Tablero página de consultas. Consulta Tabla 3

Ejecucion

Tablero página de consultas. Consulta Tabla 4

Ejecucion

Tablero página de consultas. Consulta Tabla 5

Ejecucion

Tablero página de consultas. Consulta Tabla 6

Ejecucion

Tablero página de consultas. Consulta Tabla 7

Ejecucion

Tablero página de consultas. Consulta Tabla 8

Ejecucion

Terminal:

Ejecución de menú por terminal:

Ejecucion

Mensaje de bienvenidad con menú:

Ejecucion

Consulta de usuarios:

Ejecucion

Consulta de reservaciones:

Ejecucion

Fragmentros de funciones solicitadas

Inserción de datos usuario:

Ejecucion

Inserción de datos consulta 7:

Ejecucion

Inserción de datos pelicula:

Ejecucion

Inserción de datos consulta 1:

Ejecucion

Inserción de datos consulta 6:

Ejecucion

Inserción de datos soporte pelicula:

Ejecucion

Inserción de datos de cine:

Ejecucion Ejecucion

Inserción de relación Cine Sala - Posee

Ejecucion

Inserción de relación Usuario Reservacion - Reserva, Reservacion Tipo Boleto - Compra

Ejecucion

Actulización de categoria de pelicula

Ejecucion

Eliminación relación tarjeta y reserva

Ejecucion

Consultar tabla 5

La clase select es la más amplia, ya que ofrece una gran variedad de consultas. Por simplicidad, solo mostrare una de ellas acá, pero la lógica es muy similar para las demás. Ejecucion

Siguiente pasos / Mejoras